import os
import time
import pandas as pd
import requests


def get_scraping_title(file_path, sheet_name=0, header=0, usecols=None, start_row=None, end_row=None):
    """
    读取 Excel 文件并返回 DataFrame
    
    参数:
    file_path (str): Excel 文件的路径
    sheet_name (str/int): 工作表名称或索引，默认为第一个工作表
    header (int): 标题行索引, 默认为0
    usecols (list/str): 要读取的列，默认为所有列
    start_row (int): 开始读取的行索引(包含), 默认为None表示从header后开始
    end_row (int): 结束读取的行索引(包含),默认为None表示到最后一行
    
    返回:
    pd.DataFrame: 包含 Excel 数据的 DataFrame
    """
    try:
        df = pd.read_excel(file_path, sheet_name=sheet_name, header=header, usecols=usecols)
        
        # 处理行范围
        if start_row is not None or end_row is not None:
            # 确定实际开始和结束行
            actual_start = start_row if start_row is not None else 0
            actual_end = end_row if end_row is not None else len(df) - 1
            
            # 确保范围有效
            if actual_start < 0:
                actual_start = 0
            if actual_end >= len(df):
                actual_end = len(df) - 1
                
            # 应用行范围筛选（注意：iloc是左闭右开，所以end_row+1）
            df = df.iloc[actual_start : actual_end + 1]


        return df
    except FileNotFoundError:
        print(f"错误: 文件 '{file_path}' 未找到")
        return None
    except Exception as e:
        print(f"读取 Excel 文件时出错: {str(e)}")
        return None
    

def write_temp_data(df_source, output_file, keys_map: dict):

    # 创建目标DataFrame，包含所需的4个列
    target_columns = ['title', 'url', 'scrap_time', 'status']
    df_target = pd.DataFrame(columns=target_columns)
    for _k, _vk in keys_map.items():
        if _vk is None:
            df_target[_k] = None
        else:
            df_target[_k] = df_source[_vk]


    # 保存到Excel文件
    df_target.to_excel(output_file, index=False)





def update_excel_row(file_path, code_value, title, product_url, scrap_time, status):
    """
    根据指定的code值更新Excel文件中对应行的数据
    
    参数:
        file_path: Excel文件路径
        code_value: 要查找的code值
        update_data: 要更新的数据字典，例如 {'title': '新标题', 'time': '2023-01-01', 'status': 0/1}
    """
    try:
        # 要更新的code值和数据
        # code_value = '12345'  # 替换为你要查找的code值
        update_data = {
            'title': title,
            'url': product_url, 
            'scrap_time': scrap_time,
            'status': status
        }

        # 读取Excel文件
        df = pd.read_excel(file_path)
        
        # 检查code列是否存在
        if 'registration_code' not in df.columns:
            print("错误：Excel文件中没有'code'列")
            return False
            
        # 查找匹配的行
        mask = df['registration_code'] == code_value
        if not any(mask):
            print(f"警告：未找到code值为'{code_value}'的行")
            return False
            
        # 更新数据
        for col, value in update_data.items():
            if col in df.columns and col != 'registration_code':  # 确保不更新code列
                if col=="scrap_time":
                    df[col] = pd.to_datetime(df[col])
                df.loc[mask, col] = value
            else:
                print(f"警告：列'{col}'不存在或不允许更新")
                
        # 保存回Excel文件
        df.to_excel(file_path, index=False)
        print(f"成功更新code为'{code_value}'的行")
        return True
        
    except Exception as e:
        print(f"发生错误: {str(e)}")
        return False
    

def create_dir(dir_path):
    # 如果文件夹不存在，则创建
    if not os.path.exists(dir_path):
        os.makedirs(dir_path, exist_ok=True)


def write_to_text(txt_file, params_dict):
    """
    params_dict:
        product_name: 商品名称,
        detail_url: 商品链接,
        time: 爬取时间,
    """
    with open(txt_file, 'w', encoding='utf-8') as f:
        # 将字典中的信息格式化为字符串
        content = f"商品名称: {params_dict.get('product_name', '')}\n\n"
        content += f"商品链接: {params_dict.get('detail_url', '')}\n\n"
        content += f"爬取时间: {params_dict.get('time', '')}\n"
        # 写入文件
        f.write(content)


def save_product_info(product_info, save_path):
    """保存商品信息到文件"""
    # try:
    # 创建目录
    carousel_dir = os.path.abspath(f"""{save_path}/轮播图""")
    os.makedirs(carousel_dir, exist_ok=True)

    description_dir = os.path.abspath(f"""{save_path}/详情图片""")
    os.makedirs(description_dir, exist_ok=True)
    
    # 下载图片
    download_images(product_info['carousel_images'], carousel_dir, 'carousel')
    download_images(product_info['description_images'], description_dir, 'description')

    # except Exception as e:
    #     print(f"保存商品信息时出错: {str(e)}")


def download_images(image_urls, image_dir, image_type):
    """下载图片"""
    if not image_urls:
        return
    
    os.makedirs(image_dir, exist_ok=True)
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
    }
    for i, url in enumerate(image_urls):
        try:
            response = requests.get(url, headers=headers,timeout=10)
            if response.status_code == 200:
                # 获取文件扩展名
                ext = os.path.splitext(url)[1]
                
                # 保存图片
                img_file = f"{image_dir}/{image_type}_{i+1}{ext}"
                if os.path.exists(img_file):
                    os.remove(img_file)
                with open(img_file, 'wb') as f:
                    f.write(response.content)
                # print(f"下载{image_type}图片: {url}")
            else:
                print(f"无法下载图片: {url}, 状态码: {response.status_code}")
            time.sleep(0.5)
        except Exception as e:
            print(f"下载图片时出错 {url}: {str(e)}")


def convert_dict_to_grouped_list(input_dict, group_size=5):
    """
    将字典的值转换为按指定大小分组的嵌套列表
    
    参数:
        input_dict: 输入的字典
        group_size: 每组的大小，默认为3
        
    返回:
        分组后的嵌套列表
    """
    # 获取字典的所有值
    values = list(input_dict.values())
    
    # 按指定大小分组
    grouped_list = [values[i:i + group_size] for i in range(0, len(values), group_size)]
    
    return grouped_list


def convert_dict_to_grouped_list_2(data_dict, group_size=5):
    # 将字典的 items 转换为列表
    items = list(data_dict.items())

    # # 按每 2 个键值对分组
    # group_size = 2
    grouped_list = [dict(items[i:i + group_size]) for i in range(0, len(items), group_size)]
    return grouped_list


if __name__=='__main__':
    # file_path = './docs/scraping_progress.xlsx'
    # get_scraping_title(file_path, sheet_name=0, header=0, usecols=['registration_code', 'title'], start_row=0, end_row=10)
    pass